From 9596cfe90b684f08abf678bcd0f7d6f13866ca6e Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Wed, 16 May 2018 13:13:26 +0200 Subject: [PATCH] babl: preliminary work to add float fast path to palette formats Still not accurate enough to be acceptable, gets accepted by system with a BABL_TOLERANCe of 0.045 or higher. Needs more work. --- babl/babl-palette.c | 97 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/babl/babl-palette.c b/babl/babl-palette.c index 7a06e7d..1cc9758 100644 --- a/babl/babl-palette.c +++ b/babl/babl-palette.c @@ -340,6 +340,90 @@ rgba_u8_to_pal (Babl *conversion, } } +static void +rgba_float_to_pal_a (Babl *conversion, + unsigned char *src_b, + unsigned char *dst, + long n, + void *src_model_data) +{ + BablPalette **palptr = src_model_data; + BablPalette *pal; + assert (palptr); + pal = *palptr; + assert(pal); + while (n--) + { + float *src_f = (void*) src_b; + unsigned char src[4]; + int c; + for (c = 0; c < 3; c++) + { + if (src_f[c] >= 1.0f) + src[c] = 255; + else if (src_f[c] <= 0.0f) + src[c] = 0; + else + src[c] = src_f[c] * 255 + 0.5f; + } + if (src_f[3] >= 1.0f) + src[3] = 255; + else if (src_f[3] <= 0.0f) + src[3] = 0; + else + src[3] = src_f[3] * 255 + 0.5f; + + + dst[0] = babl_palette_lookup (pal, src[0], src[1], src[2], src[3]); + dst[1] = src[3]; + + src_b += sizeof (float) * 4; + dst += sizeof (char) * 2; + } +} + + +static void +rgba_float_to_pal (Babl *conversion, + unsigned char *src_b, + unsigned char *dst, + long n, + void *src_model_data) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + BablPalette **palptr = src_model_data; + BablPalette *pal; + assert (palptr); + pal = *palptr; + assert(pal); + while (n--) + { + float *src_f = (void*) src_b; + unsigned char src[4]; + int c; + for (c = 0; c < 3; c++) + { + if (src_f[c] >= 1.0f) + src[c] = 255; + else if (src_f[c] <= 0.0f) + src[c] = 0; + else + src[c] = src_f[c] * 255 + 0.5f; + } + if (src_f[3] >= 1.0f) + src[3] = 255; + else if (src_f[3] <= 0.0f) + src[3] = 0; + else + src[3] = src_f[3] * 255 + 0.5f; + + dst[0] = babl_palette_lookup (pal, src[0], src[1], src[2], src[3]); + + src_b += sizeof (float) * 4; + dst += sizeof (char) * 1; + } +} + static void rgba_u8_to_pal_a (Babl *conversion, unsigned char *src, @@ -602,6 +686,19 @@ const Babl *babl_new_palette (const char *name, "data", palptr, NULL); + babl_conversion_new ( + babl_format ("R'G'B'A float"), + f_pal_a_u8, + "linear", rgba_float_to_pal_a, + "data", palptr, + NULL); + babl_conversion_new ( + babl_format ("R'G'B'A float"), + f_pal_u8, + "linear", rgba_float_to_pal, + "data", palptr, + NULL); + babl_set_user_data (model, palptr); babl_set_user_data (model_no_alpha, palptr); -- 2.30.2